/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.com.intesal.compra.managed;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.primefaces.event.RowEditEvent;
import sv.com.intesal.clases.LimpiarManaged;
import sv.com.intesal.clases.Mensaje;
import sv.com.intesal.clases.cVarios;
import sv.com.intesal.compra.bean.Compra;
import sv.com.intesal.compra.bean.DevolucionCompra;
import sv.com.intesal.compra.controlador.CompraControlador;
import sv.com.intesal.compra.controlador.DevolucionCompraControlador;
import sv.com.intesal.seguridad.controlador.ParametroFacturacionControlador;
import sv.com.intesal.seguridad.controlador.SessionControlador;
import sv.com.intesal.seguridad.managed.SessionManaged;

/**
 *
 * @author ejerez
 */
@ManagedBean(name = "devolucionCompraManaged")
@ViewScoped
public class DevolucionCompraManaged implements Serializable {

    private Mensaje m;
    private SessionManaged sm;
    private DevolucionCompra selectedEncaDevolucionCompra;
    private DevolucionCompra selectedDetaDevolucionCompra;
    private List<DevolucionCompra> devolucionCompras;

    /*COMPRA*/
    private Compra selectedEncaCompra;
    private Compra selectedDetaCompra;
    private Compra selectedDetaCompraTotales;
    private List<Compra> compras;

    public DevolucionCompraManaged() {
        this.m = new Mensaje();
        this.sm = new SessionManaged();
        this.selectedDetaDevolucionCompra = new DevolucionCompra();
        this.selectedEncaDevolucionCompra = new DevolucionCompra();

        /*COMPRA*/
        this.selectedDetaCompraTotales = new Compra();
        this.selectedEncaCompra = new Compra();
        this.selectedDetaCompra = new Compra();
    }

    public void validarRedirect_Compra() {
        SessionControlador sc = new SessionControlador();
        try {
            if (sc.getCodigo_Proceso_Modificar() != 0) {
                this.getDatosDeCompra(sc.getCodigo_Proceso_Modificar());
                sc.setCodigo_Proceso_Modificar(0);
            }
        } catch (Exception e) {
            sc.setCodigo_Proceso_Modificar(0);
            e.printStackTrace();
            m.messageError(m.getIerror());
        }
    }

    public void validarRedirect_DevolucionCompra() throws Exception {
        SessionControlador sc = new SessionControlador();
        try {
            if (sc.getCodigo_Proceso_DC() != 0) {
                DevolucionCompraControlador dc = new DevolucionCompraControlador();

                this.selectedEncaDevolucionCompra = dc.getDevolucionCompra(sc.getCodigo_Proceso_DC());
                sc.setCodigo_Proceso_DC(0);
                this.devolucionCompras = dc.getDetaDevolucionCompra(this.selectedEncaDevolucionCompra.getCodigo_dc());

                /*get compra*/
                this.getDatosDeCompra(this.selectedEncaDevolucionCompra.getId_c());
                this.getSelectedCompraInRedirectList();
            }
        } catch (Exception e) {
            sc.setCodigo_Proceso_DC(0);
            e.printStackTrace();
            m.messageError(m.getIerror());
        }
    }

    private void getDatosDeCompra(Integer codigo_compra) throws Exception {
        try {
            CompraControlador cc = new CompraControlador();
            this.selectedEncaCompra = cc.getEnca(codigo_compra);
            this.compras = cc.getDeta_Compra(this.selectedEncaCompra.getId_c());
            this.selectedDetaCompraTotales = cc.getTotales_x_Compra(this.selectedEncaCompra.getId_c());
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    private void getSelectedCompraInRedirectList() throws Exception {
        /*ESTABLECER LA COMPRA EN EL DETALLE DEVOLUCION_COMPRA*/
        try {
            for (int i = 0; i < this.compras.size(); i++) {
                for (int j = 0; i < this.devolucionCompras.size(); i++) {
                    if (this.compras.get(i).getId_d() == this.devolucionCompras.get(j).getCodigo_id_d()) {
                        this.devolucionCompras.get(j).setCompra(this.compras.get(i));
                    }
                }
            }
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void completeTransaccion() {
        try {
            if (this.validar() == true) {
                if (this.selectedEncaDevolucionCompra.getCodigo_dc() == null) {
                    if (sm.validar_rol_usuario("wfrmDevolucionCompra", sm.agregar) == true) {

                        this.selectedEncaDevolucionCompra.setCompra(this.selectedEncaCompra);

                        DevolucionCompraControlador dc = new DevolucionCompraControlador();
                        dc.setEnca(this.selectedEncaDevolucionCompra, this.devolucionCompras);
                        LimpiarManaged.limpiar();
                    }
                } else {
                    if (sm.validar_rol_usuario("wfrmDevolucionCompra", sm.modificar) == true) {

                        this.selectedEncaDevolucionCompra.setCompra(this.selectedEncaCompra);

                        DevolucionCompraControlador dc = new DevolucionCompraControlador();
                        dc.setEnca(this.selectedEncaDevolucionCompra, this.devolucionCompras);
                        LimpiarManaged.limpiar();
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            m.messageError(m.getIerror());
        }
    }

    private Boolean validar() throws Exception {
        try {
            Boolean var_return = true;

            if (this.selectedEncaCompra.getId_c() == null) {
                m.messageAdvertencia("DEBE ELEGIR UN REGISTRO DE COMPRA PARA CONTINUAR");
                var_return = false;
            }

            if (this.selectedEncaDevolucionCompra.getFecha_dc() == null) {
                m.messageAdvertencia("DEBE ELEGIR UN REGISTRO DE COMPRA PARA CONTINUAR");
                var_return = false;
            }
            if (this.selectedEncaDevolucionCompra.getNumero_factura_dc() == null) {
                m.messageAdvertencia(m.campoError("NÚMERO DE FACTURA"));
                var_return = false;
            }

            if (this.devolucionCompras == null) {
                m.messageAdvertencia(m.campoError("MATERIALES"));
                var_return = false;
            } else if (this.devolucionCompras.size() > 0) {
                for (int i = 0; i < this.devolucionCompras.size(); i++) {
                    try {
                        if (this.devolucionCompras.get(i).getCantidad_d() <= 0) {
                            m.messageAdvertencia("HAY CANTIDADES QUE NO SON ACEPTABLES");
                            var_return = false;
                            break;
                        }
                    } catch (Exception e) {
                        var_return = false;
                        break;
                    }
                }
            }

            if (var_return == true) {
                DevolucionCompraControlador dc = new DevolucionCompraControlador();

                for (int i = 0; i < this.devolucionCompras.size(); i++) {
                    if (this.devolucionCompras.get(i).getId_d() == 0) {
                        if (dc.validarCantidad_x_Compra_en_DevolucionCompra(this.devolucionCompras.get(i)) == false) {
                            m.messageAdvertencia(m.campoError("NO PUEDE DEVOLVER UNA CANTIDAD MAYOR A LA COMPRADA"));
                            var_return = false;
                            break;
                        }
                    }
                }
            }
            return var_return;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void compraSelected() {

        try {
            if (this.selectedDetaCompra == null) {
                m.messageError("DEBE SELECCIONAR UN REGISTRO PARA CONTINUAR");
            } else {
                if (this.validarRegistroCompra(this.selectedDetaCompra.getId_d()) == true) {
                    List<DevolucionCompra> lista = new ArrayList<DevolucionCompra>();
                    if (this.getDevolucionCompras() != null) {
                        lista = this.getDevolucionCompras();
                    }

                    DevolucionCompra dc = new DevolucionCompra();
                    dc.setId_d(0); //deta devolucion_compra
                    dc.setId_dm(this.selectedDetaCompra.getId_dm());
                    dc.setCodigo_id_d(this.selectedDetaCompra.getId_d());

                    dc.setNombre_m(this.selectedDetaCompra.getNombre_m());
                    dc.setCantidad_d(this.selectedDetaCompra.getCantidad_d());
                    dc.setIva_d(this.selectedDetaCompra.getIva_d());
                    dc.setCosto_d(this.selectedDetaCompra.getCosto_cd_d());
                    dc.setMonto_d(this.selectedDetaCompra.getSubTotal_d());
                    dc.setExento_d(0.0);

                    dc.setId_c(this.selectedDetaCompra.getId_c());
                    dc.setCompra(this.selectedDetaCompra);

                    lista.add(dc);
                    this.setDevolucionCompras(lista);
                }
            }
        } catch (Exception e) {
            m.messageError(m.getIerror());
            e.printStackTrace();
        }
    }

    private Boolean validarRegistroCompra(Integer id_d) throws Exception {
        try {
            Boolean var_return = true;

            if (this.devolucionCompras == null) {
                var_return = true;
            } else if (this.devolucionCompras.size() >= 0) {

                for (int i = 0; i < this.devolucionCompras.size(); i++) {
                    System.out.println("codigo de compra deta= " + this.devolucionCompras.get(i).getCodigo_id_d());
                    if (this.devolucionCompras.get(i).getCodigo_id_d() == id_d) {
                        m.messageAdvertencia("REGISTRO YA FUE SELECCIONADO");
                        var_return = false;
                        break;
                    }
                }
            }
            return var_return;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void calcularTotales() {

        try {
            if (this.validarCalcularTotales() == true) {
                cVarios v = new cVarios();
                ParametroFacturacionControlador pf = new ParametroFacturacionControlador();

                Double iva = pf.getIva();
                for (int i = 0; i < this.devolucionCompras.size(); i++) {

                    this.devolucionCompras.get(i).setExento_d(0.0);
                    this.devolucionCompras.get(i).setIva_d(0.0);
                    this.devolucionCompras.get(i).setMonto_d(0.0);

                    if (this.selectedEncaCompra.getTipo_c().equals("CCF")) {
                        this.devolucionCompras.get(i).setIva_d(
                                v.AproximarDecimal((this.devolucionCompras.get(i).getCantidad_d() * this.devolucionCompras.get(i).getCosto_d()) * pf.getIva()));
                    }

                    this.devolucionCompras.get(i).setMonto_d(
                            v.AproximarDecimal((this.devolucionCompras.get(i).getCantidad_d() * this.devolucionCompras.get(i).getCosto_d())
                            + this.devolucionCompras.get(i).getIva_d() + this.devolucionCompras.get(i).getExento_d()));
                }

            }
        } catch (Exception e) {
            e.printStackTrace();
            m.messageError(m.getIerror());
        }
    }

    public void onEditRow(RowEditEvent event) {
        try {
            this.calcularTotales();
        } catch (Exception e) {
            e.printStackTrace();
            m.messageError(m.getIerror());
        }
    }

    private Boolean validarCalcularTotales() throws Exception {

        try {
            Boolean var_return = true;

            for (int i = 0; i < this.devolucionCompras.size(); i++) {
                if (devolucionCompras.get(i).getCosto_d() <= 0.00 || devolucionCompras.get(i).getCantidad_d() == 0.00) {
                    m.messageAdvertencia("Hay DATOS QUE NO SON VALIDOS EN EL GRID");
                    var_return = false;
                    break;
                }
            }

            return var_return;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void eliminarRegistro() {
        try {
            if (this.selectedDetaDevolucionCompra == null) {
                m.messageError("DEBE ELEGIR UN REGISTRO PARA CONTINUAR");
            } else if (selectedDetaDevolucionCompra.getId_d() == 0) {
                this.devolucionCompras.remove(this.selectedDetaDevolucionCompra);
                m.messageInfo(m.getIeliminada());
            } else {
                if (sm.validar_rol_usuario("wfrmDevolucionCompra", sm.eliminar) == true) {
                    DevolucionCompraControlador dc = new DevolucionCompraControlador();
                    this.selectedDetaDevolucionCompra.setNumero_factura_dc(this.selectedEncaDevolucionCompra.getNumero_factura_dc());
                    this.selectedDetaDevolucionCompra.setCodigo_dc(this.selectedEncaDevolucionCompra.getCodigo_dc());

                    this.devolucionCompras.remove(this.selectedDetaDevolucionCompra);
                    dc.setEliminarItem(this.selectedDetaDevolucionCompra);
                }
            }
        } catch (Exception e) {
            m.messageError(m.getIerror());
            e.printStackTrace();
        }
    }

    /*SETTERS ABD GETTERS*/
    public List<Compra> getCompras() {
        return compras;
    }

    public void setCompras(List<Compra> compras) {
        this.compras = compras;
    }

    public Compra getSelectedDetaCompra() {
        if (selectedDetaCompra == null) {
            selectedDetaCompra = new Compra();
        }
        return selectedDetaCompra;
    }

    public void setSelectedDetaCompra(Compra selectedDetaCompra) {
        this.selectedDetaCompra = selectedDetaCompra;
    }

    public DevolucionCompra getSelectedDetaDevolucionCompra() {
        if (selectedDetaDevolucionCompra == null) {
            selectedDetaDevolucionCompra = new DevolucionCompra();
        }
        return selectedDetaDevolucionCompra;
    }

    public void setSelectedDetaDevolucionCompra(DevolucionCompra selectedDetaDevolucionCompra) {
        this.selectedDetaDevolucionCompra = selectedDetaDevolucionCompra;
    }

    public Compra getSelectedEncaCompra() {
        if (selectedEncaCompra == null) {
            selectedEncaCompra = new Compra();
        }
        return selectedEncaCompra;
    }

    public void setSelectedEncaCompra(Compra selectedEncaCompra) {
        this.selectedEncaCompra = selectedEncaCompra;
    }

    public DevolucionCompra getSelectedEncaDevolucionCompra() {
        if (selectedEncaDevolucionCompra == null) {
            selectedEncaDevolucionCompra = new DevolucionCompra();
        }
        return selectedEncaDevolucionCompra;
    }

    public void setSelectedEncaDevolucionCompra(DevolucionCompra selectedEncaDevolucionCompra) {
        this.selectedEncaDevolucionCompra = selectedEncaDevolucionCompra;
    }

    public List<DevolucionCompra> getDevolucionCompras() {
        return devolucionCompras;
    }

    public void setDevolucionCompras(List<DevolucionCompra> devolucionCompras) {
        this.devolucionCompras = devolucionCompras;
    }

    public Compra getSelectedDetaCompraTotales() {
        if (selectedDetaCompraTotales == null) {
            selectedDetaCompraTotales = new Compra();
        }
        return selectedDetaCompraTotales;
    }

    public void setSelectedDetaCompraTotales(Compra selectedDetaCompraTotales) {
        this.selectedDetaCompraTotales = selectedDetaCompraTotales;
    }
}
